package com.pdh.contoller;

import com.github.pagehelper.PageInfo;
import com.pdh.entity.Bill;
import com.pdh.entity.BillType;
import com.pdh.service.BillService;
import com.pdh.service.TypeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * @Author: 彭_德华
 * @Date: 2021-08-30 13:38
 * @Description: 后端处理差不多就是这样，跟多的是前端处理
 */
@Controller
@RequestMapping("/bill") //根注解
public class BillController {
    @Autowired
    private TypeService typeService;
    @Autowired
    private BillService billService;

    /**
     * 查询
     * @param bill 接收页面请求的参数
     * @param model 把查询的结果放到model中，此model会响应到前端数据
     * @return
     */
    @RequestMapping("/list")
    public String list(Bill bill, Model model){
        List<BillType> types = typeService.list();
        //在数据展示的时候，需要直接获取到类型列表
        model.addAttribute("types",types);

        //获取账单列表
        List<Bill> bills = billService.list(bill);
        model.addAttribute("bills",bills);

        /**
         * 跳转到此路径进行数据显示，相当于发起此请求
         * 遵循HTML5规范，不能写成
         *      return "/bill/list";
         */
        return "bill/list";
    }

    /**
     * 分页查询
     * @param bill 接收页面请求的参数
     * @param model 把查询的结果放到model中
     * @return
     */
    @RequestMapping("/list-page")
    public String listPage(
            /**
             * RequestParam：匹配请求中的参数，传递的名称与之对应即可
             * 接收前端发过来的name属性，且字符必须得一一对应
             */
            @RequestParam(defaultValue = "1") int pageNum,
            @RequestParam(defaultValue = "10") int pageSize,
            Bill bill,
            Model model){
        List<BillType> types = typeService.list();
        model.addAttribute("types",types);
        PageInfo page = billService.listPage(bill,pageNum,pageSize);
        model.addAttribute("page",page);

        return "bill/list-page";
    }

    /**
     * 跳转到添加页面
     * @param model 获取对应的数据存储在model中，model拿到数据后进行响应
     * @return
     */
    @RequestMapping("/toAdd")
    public String toAdd(Model model){
        List<BillType> types = typeService.list();
        model.addAttribute("types",types);
        return "bill/add";
    }

    /**
     * 添加
     * 添加完就跳转到list页面
     * @param bill
     * @return
     */
    @RequestMapping("/add")
    public String add(Bill bill){
        billService.add(bill);
        //这里是重定向到此页面
        return "redirect:/bill/list-page";
    }

    /**
     * 删除
     * 传入id
     * @param id
     * @return
     */
    @RequestMapping("/delete/{id}") // delete/{id} 这种请求格式，用占位符传参
    public String delete(@PathVariable("id") Long id){
        billService.delete(id);
        return "redirect:/bill/list-page";
    }


    /**
     * 修改
     * 跳转到修改页面
     * @param id
     * @param model
     * @return
     */
    @RequestMapping("/toUpdate/{id}")
    public String toUpdate(
            //@PathVariable注解匹配请求中传递的参数
            @PathVariable("id") Long id
            ,Model model){
        List<BillType> types = typeService.list();
        model.addAttribute("types",types);
        Bill bill = billService.get(id);
        model.addAttribute("bill",bill);

        return "bill/update";
    }

    /**
     * 修改
     * @param bill
     * @return
     */
    @RequestMapping("/update")
    public String update(Bill bill){
        billService.update(bill);
        return "redirect:/bill/list-page";
    }
}
